home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / satellit / pbsv004 / pbkiss.c < prev    next >
C/C++ Source or Header  |  1993-08-05  |  5KB  |  298 lines

  1. /* pbkiss.c 1993.8.6 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <ctype.h>
  7. /* #include <conio.h> */
  8. #include <memory.h>
  9.  
  10. #include "pbsv.h"
  11.  
  12. /* KISS TNC control */
  13. #define    KISS_DATA    0
  14. #define    KISS_TXD    1
  15. #define    KISS_P        2
  16. #define    KISS_ST        3
  17. #define    KISS_TXT    4
  18. #define    KISS_FD        5
  19. #define    KISS_HW        6
  20. #define KISS_KPC_2   0x10
  21. #define    KISS_RETURN    0xff
  22.  
  23. #define    FEND    0300    /* Frame End */
  24. #define    FESC    0333    /* Frame Escape */
  25. #define    TFEND    0334    /* Transposed frame end */
  26. #define    TFESC    0335    /* Transposed frame escape */
  27.  
  28.  
  29. extern VOID timer();                /* pbsv.c */
  30. extern BOOL f_hex,f_header;
  31.  
  32. /* kiss mode parm */
  33. extern int txd,persist,slottime,txtail;
  34. extern int fullduplex,sethardware,softdcd;
  35. extern int port;
  36. extern int kissrom;
  37. extern int multikiss;
  38.  
  39. extern clock_t tim_1;
  40.  
  41. extern int initrs(int);                /* pbrs232c.c */
  42. extern int rsgetc(int),rsputc(int,char);
  43. extern int rsputs(int,char*);
  44. extern BOOL check_port(int);
  45.  
  46. BOOL f_rkss = OFF;
  47. int lnrkss;
  48. char rkss[FRMSIZE];
  49.  
  50. BOOL f_skss = OFF;    /* send req flag */
  51. int lnskss;        /* send frame length */
  52. char skss[FRMSIZE];
  53.  
  54.  
  55. /*
  56.  * < inikss > initialize KISS mode
  57.  */
  58. VOID inikss()
  59. {
  60.     VOID montnc(int),kissparm(int,int);
  61.  
  62.     int r;
  63.  
  64.     r = initrs(port);        /* init RS232C */
  65.     switch(r) {
  66.         case 1:
  67.         printf("OK port[COM%d]\n",port+1);
  68.         if (kissrom == 0) {
  69.             rsputs(port,"\r");
  70.         montnc(1);
  71.         printf("KISS ON\n");
  72.             rsputs(port,"KISS ON\r");
  73.         montnc(1);
  74.         printf("RESTART\n");
  75.         rsputs(port,"RESTART\r");
  76.         montnc(4);
  77.             printf("\n");
  78.  
  79.         if (txd != NOT_DEFINE)
  80.             kissparm(1,txd/10);
  81.         if (persist != NOT_DEFINE)
  82.             kissparm(2,persist/10);
  83.         if (slottime != NOT_DEFINE)
  84.             kissparm(3,slottime/10);
  85.         if (txtail != NOT_DEFINE)
  86.             kissparm(4,txtail/10);
  87.         kissparm(5,fullduplex);
  88.         kissparm(6,sethardware);
  89.         kissparm(7,softdcd);
  90.         }
  91.         break;
  92.     case 2:
  93.         printf("Error: port not active[COM%d]\n",port+1);
  94.         exit(1);
  95.         /* NOT REACHED */
  96.  
  97.     case 3:
  98.         printf("Error: COMBIOS not exist[COM%d]\n",port+1);
  99.         exit(1);
  100.             /* NOT REACHED */
  101.  
  102.     default:
  103.         break;
  104.     }
  105. }
  106.  
  107. /*
  108.  * < exitkss > exit KISS mode
  109.  */
  110. VOID exitkss()
  111. {
  112.     VOID montnc(int);
  113.  
  114.     if (kissrom == 0) {
  115.         rsputc(port,(char)0xff);
  116.         rsputc(port,(char)0xc0);
  117.         rsputc(port,(char)0xff);
  118.     montnc(4);
  119.     printf("\n");
  120.     }
  121. }
  122.  
  123. /*
  124.  * < montnc > monitor TNC
  125.  */
  126. VOID montnc(int t)
  127. {
  128.     int c;
  129.  
  130.     timer();
  131.     for (tim_1 = t; tim_1 > 0;) {
  132.         timer();
  133.     if (check_port(port)) {
  134.             c = rsgetc(port);
  135.             if (c == '\r')
  136.             putch('\n');
  137.         putch(c);
  138.     }
  139.     }
  140. }
  141.  
  142. /*
  143.  * < rcvkss > recive KISS frame
  144.  */
  145. VOID rcvkss()
  146. {
  147.     VOID hexdump();
  148.  
  149.     static int seq = 0;
  150.  
  151.     int c;
  152.  
  153.     if (!check_port(port))
  154.         return;
  155.  
  156.     c = rsgetc(port);
  157.  
  158.     switch(seq) {
  159.         case 0:
  160.         f_rkss = OFF;
  161.         lnrkss = 0;
  162.         if (c == FEND)
  163.             seq++;
  164.         break;
  165.     case 1:
  166.         if (c == FEND) {
  167.             if (lnrkss > 0) {
  168.             f_rkss = ON;
  169.             seq = 0;
  170.             if (f_hex) {
  171.                 hexdump(rkss,lnrkss);
  172.             }
  173.             break;
  174.         }
  175.         } else if (c == FESC) {
  176.             seq++;
  177.         } else {
  178.             if (lnrkss >= FRMSIZE) {
  179.             seq = 0;
  180.             break;
  181.         }
  182.             rkss[lnrkss++] = c;
  183.         }
  184.         break;
  185.     case 2:
  186.         if (c == TFEND) {
  187.             c = FEND;
  188.         } else if (c == TFESC) {
  189.             c = FESC;
  190.         } else {
  191.             seq = 0;
  192.         break;
  193.         }
  194.             if (lnrkss >= FRMSIZE) {
  195.             seq = 0;
  196.         break;
  197.         }
  198.         rkss[lnrkss++] = c;
  199.         seq--;
  200.         break;
  201.     default:
  202.         break;
  203.     }
  204.     return;
  205. }
  206.  
  207. /*
  208.  * < sndkss > send KISS frame
  209.  */
  210. VOID sndkss()
  211. {
  212.     VOID hexdump();
  213.  
  214.     int i,c;
  215.  
  216.     if (f_hex) {
  217.         hexdump(skss,lnskss);
  218.     }
  219.     rsputc(port,(char)FEND);
  220.     for (i = 0; i < lnskss; i++) {
  221.         c = skss[i];
  222.         switch(c) {
  223.         case FEND:
  224.             rsputc(port,(char)FESC);
  225.         rsputc(port,(char)TFEND);
  226.             break;
  227.         case FESC:
  228.             rsputc(port,(char)FESC);
  229.         rsputc(port,(char)TFESC);
  230.             break;
  231.         default:
  232.             rsputc(port,(char)c);
  233.         break;
  234.     }
  235.     }
  236.     rsputc(port,(char)FEND);
  237. }
  238.  
  239. /*
  240.  * < kissparm > KISS mode parm
  241.  */
  242. VOID kissparm(cmd,parm)
  243. int cmd,parm;
  244. {
  245.     if (parm == NOT_DEFINE)
  246.         return;
  247.  
  248.     skss[0] = (multikiss<<4) | (cmd & 0x0f);
  249.     skss[1] = parm;
  250.     lnskss = 2;
  251.     sndkss();
  252. }
  253.  
  254. /*
  255.  * < hexdump > Hex dump display
  256.  */
  257. VOID hexdump(p,n)
  258. u_char p[];
  259. int n;
  260. {
  261.     static char *buf =
  262. "000: 00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 0123456789ABCDEF";
  263.  
  264.     char tmp[5];
  265.     int c,c2,i,j,p1;
  266.  
  267.     for (i = j = 0; i < n; i++) {
  268.         if (j == 0) {
  269.         memset(buf,' ',74);
  270.         buf[74] = '\0';
  271.         sprintf(tmp,"%03X:",i);
  272.         memcpy(buf,tmp,4);
  273.         p1 = 5;
  274.     }
  275.     c = p[i];
  276.     c2 = c>>1;
  277.     sprintf(tmp,"%02X",(c & 0xff));
  278.     memcpy(buf+p1,tmp,2);
  279.     p1 += 2;
  280.     if ((j&3) == 3)
  281.         p1++;
  282.     if (!isprint(c2))
  283.         c2 = '.';
  284.     buf[j+41] = c2;
  285.     if (!isprint(c))
  286.         c = '.';
  287.     buf[j+58] = c;
  288.     if (++j == 16) {
  289.         j = 0;
  290.         printf("%s\n",buf);
  291.     }
  292.     }
  293.     if (j != 0)
  294.         printf("%s\n",buf);
  295. }
  296.  
  297. /* pbkiss.c */
  298.